# 面向对象会涉及到方法和属性，而方法和属性是有着访问控制权限的，分为公有权限和私有权限
# 公有权限：直接书写的方法及属性都是公有的，可在任意地方访问和使用
# 私有权限：在一个类别内部，属性或方法前面加了两个下划线的就是私有的，它（们）只能在该类内部使用，外部无权访问和使用


class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def __str__(self):  # 由于类内可以正常访问私有属性，所以行16代码不受影响
        return f'名字：{self.name}，年龄：{self.__age}'


xm = Person('小明', 18)
print(xm)  # 在类外使用方法
print(xm.__dict__)
# print(xm.__age)  # 在类外访问属性，当该属性为私有的时，代码运行到这步报错：理由是找不到私有属性，这说明外部确实无权访问私有性质的属性或方法
xm.__age = 20  # 在类外修改属性，当该属性为私有时，这一步代码实际上不是对私有操作，而是新添了一个公有属性，并赋值为20
print(xm)  # 很显然私有属性未被类外的'形似'更改属性语句给修改
print(xm.__dict__)  # 从结果中可见：解释器自动把私有属性重命名，所以不用新的名字是影响不到私有属性的，同时可见多了一个新生的公有属性
